package cn.huaqingcheng.tianshu.common.core;

import org.jetbrains.annotations.Nullable;

import java.util.UUID;
import java.util.regex.Pattern;

/**
 * FileTool
 */
public interface FileTool {

    /**
     * 中划线
     */
    Pattern DASH = Pattern.compile("-");


    /**
     * 生成唯一路径, 唯一是尽力而为的, 例如 UUID
     *
     * @param scopeName 文件夹名
     * @param fileName  文件名
     * @return 唯一文件路径, 例如: {@code /scopeName/唯一标识.extensionName}
     */
    static String getUniquePath(@Nullable String scopeName, @Nullable String fileName) {
        String scope = StrTool.firstNotEmpty(scopeName, "unknown");
        String uniqueName = DASH.matcher(UUID.randomUUID().toString())
                .replaceAll(StrTool.EMPTY);

        String extension = getFileExtension(fileName);

        return StrTool.isEmpty(extension)
               ? "/%s/%s".formatted(scope, uniqueName)
               : "/%s/%s.%s".formatted(scope, uniqueName, extension);
    }

    /**
     * 从文件名解析文件扩展名
     *
     * @param fileName 文件名
     * @return 扩展名, 不含前缀 .
     */
    static String getFileExtension(@Nullable String fileName) {
        if (StrTool.isEmpty(fileName)) {
            return StrTool.EMPTY;
        }
        // 获取最后一个路径分隔符后的文件名部分
        String name = fileName;
        int lastSeparatorIndex = fileName.lastIndexOf('/');
        if (lastSeparatorIndex >= 0 && lastSeparatorIndex < fileName.length() - 1) {
            name = fileName.substring(lastSeparatorIndex + 1);
        }

        // 查找文件名中的最后一个点
        int lastDotIndex = name.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < name.length() - 1) {
            return name.substring(lastDotIndex + 1);
        }
        return StrTool.EMPTY;
    }

    /**
     * 删除前缀字符
     */
    static String removePrefixChar(@Nullable String path, char c) {
        if (StrTool.isEmpty(path)) {
            return StrTool.EMPTY;
        }
        return path.startsWith(String.valueOf(c))
               ? path.substring(1)
               : path;
    }

    /**
     * 删除前缀分隔符
     */
    static String removePrefixSeparator(@Nullable String path) {
        return removePrefixChar(path, '/');
    }

}
